package gui;

import gui.factory.SearchTableFactory;
import gui.factory.TableFactory;

import java.awt.Color;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.bindings.NotNullObservable;
import org.uqbar.arena.layout.ColumnLayout;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.TextBox;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.Window;
import org.uqbar.arena.windows.WindowOwner;
import org.uqbar.commons.model.Search;

import aOrganizar.Asiento;
import aOrganizar.Usuario;

/**
 * Ventana de búsqueda de asientos.
 * 
 * 
 * @author martin
 */
@SuppressWarnings("serial")
public class BuscadorAsientosWindow extends SimpleWindow<BuscadorAsientos> {
	
	TableFactory tableFactory;
	
	public BuscadorAsientosWindow(WindowOwner parent, Usuario usuario) {
		super(parent, new BuscadorAsientos(usuario));
		this.tableFactory = new SearchTableFactory();
	}


	/**
	 * El default de la vista es un formulario que permite disparar la búsqueda (invocando con super) Además
	 * le agregamos una grilla con los resultados de esa búsqueda y acciones que pueden hacerse con elementos
	 * de esa búsqueda
	 */
	@Override
	protected void createMainTemplate(Panel mainPanel) {
		this.setTitle("Aterrizar.com - Buscador de Asientos");
		this.setTaskDescription("Ingrese los parámetros de búsqueda");

		super.createMainTemplate(mainPanel);
		this.createResultsGrid(mainPanel);
		this.createGridActions(mainPanel);
		
	}

// *************************************************************************
// * FORMULARIO DE BUSQUEDA 
// *************************************************************************
	
	/**
	 * El panel principal de búsuqeda permite filtrar por Origen, Destino y Fecha
	 */
	@Override
	protected void createFormPanel(Panel mainPanel) {
		Panel searchFormPanel = new Panel(mainPanel);
		searchFormPanel.setLayout(new ColumnLayout(2));
		
		createTextBox(searchFormPanel,"Origen","origen");
		createTextBox(searchFormPanel,"Destino","destino");
		createTextBox(searchFormPanel,"Fecha","fecha");

	}

	/**
	 * Acciones asociadas de la pantalla principal. Interesante para ver es cómo funciona el binding que mapea
	 * la acción que se dispara cuando el usuario presiona click Para que el binding sea flexible necesito
	 * decirle objeto al que disparo la acción y el mensaje a enviarle Contra: estoy atado a tener métodos sin
	 * parámetros. Eso me impide poder pasarle parámetros como en el caso del alta/modificación.
	 * Buscar/Limpiar -> son acciones que resuelve el modelo (BuscadorCelular) Nuevo -> necesita disparar una
	 * pantalla de alta, entonces lo resuelve la vista (this)
	 * 
	 */
	@Override
	protected void addActions(Panel actionsPanel) {
		createButton(actionsPanel,"Buscar",new MessageSend(this.getModelObject(), Search.SEARCH))
		.setAsDefault();	
	}


// *************************************************************************
// **  RESULTADOS DE LA BUSQUEDA 
// *************************************************************************
	
	/**
	 * Se crea la grilla en el panel de abajo El binding es: el contenido de la grilla en base a los
	 * resultados de la búsqueda Cuando el usuario presiona Buscar, se actualiza el model, y éste a su vez
	 * dispara la notificación a la grilla que funciona como Observer
	 */
	protected void createResultsGrid(Panel mainPanel) {
		this.tableFactory.createTable(mainPanel, "resultados", "itinerarioSeleccionado");
	}


	protected void createGridActions(Panel mainPanel) {
		Panel actionsPanel = new Panel(mainPanel);
		actionsPanel.setLayout(new HorizontalLayout());
		
		NotNullObservable elementSelected = new NotNullObservable("itinerarioSeleccionado");

		createButton(actionsPanel, "Limpiar", new MessageSend(this.getModelObject(), "clear"));
		createButton(actionsPanel, "Comprar", new MessageSend(this, "comprar"))
		.bindEnabled(elementSelected);
		createButton(actionsPanel, "Reservar", new MessageSend(this, "reservar"))
		.bindEnabled(elementSelected);
		createButton(actionsPanel, "Cerrar", new MessageSend(this, "close"));
	}

	// ********************************************************
	// ** Acciones
	// ********************************************************

	public void comprar() {
		this.openDialog(new MensajeCompraWindow(this, this.getModelObject().getItinerarioSeleccionado().getAsientos().get(0)));
	}
	
	public void reservar()
	{
		//Armo el asiento.
		Asiento asiento = this.getModelObject().getItinerarioSeleccionado().getAsientos().get(0);
		
		//Si da True, reserva OK!
		if (this.getModelObject().reservar()==true)
		{
			System.out.println("ok");
			this.openDialog(new MensajeReservaWindow(this,asiento,this.getModelObject().getUsuario(),false));
		}
		else
		{
			System.out.println("sobrereserva");
			//Preguntar si se sobrereserva?
			this.openDialog(new MensajeReservaWindow(this,asiento,this.getModelObject().getUsuario(),true));
		}
	}
	
	protected void openDialog(Window<?> dialog) {
		dialog.open();
	}
	
	private void createTextBox(Panel panel,String label, String property) {
		new Label(panel).setText(label).setForeground(Color.BLUE);
		new TextBox(panel).bindValueToProperty(property);
	}
	
	private Button createButton(Panel panel, String caption,
			MessageSend messageSend) {
		return new Button(panel).setCaption(caption).onClick(messageSend);

	}

}
